﻿#define _CRT_SECURE_NO_WARNINGS 1
//一下代码请配合6月16日所写的博客一起使用
int get_des(char* s)
{
    int count = 0;//用于储存最小字母出现的次数
    char smaller = 'z';
    int i = 0;
    while (s[i])
    {
        if (s[i] < smaller)
        {
            smaller = s[i];
            count = 1;//如果有新的最小字母出现那就要让count的值重新置为1
        }
        else if (s[i] == smaller)
        {
            count++;
        }//如果再次出现了最小字母那就让计数器加1
        i++;//遍历整个字符串
    }
    return count;
}
int* numSmallerByFrequency(char** queries, int queriesSize, char** words, int wordsSize, int* returnSize) {
    int* ret = (int*)malloc(sizeof(int) * queriesSize);
    memset(ret, 0, sizeof(int) * queriesSize);//将里面的值初始化为0
    int wordscount[wordsSize];//这个数组用于储存words每一个字符串中最小字符出现的次数
    for (int i = 0; i < wordsSize; i++)
    {
        wordscount[i] = get_des(words[i]);
        为wordscount数组赋值
    }
    for (int i = 0; i < queriesSize; i++)
    {
        int queriescount = get_des(queries[i]);//这个常量用于储存queries数组中每一个字符串
        最小字母出现的次数
        for (int k = 0; k < wordsSize; k++)
        {
            if (wordscount[k] > queriescount)
                ret[i]++;//如果words数组中出现了最小字母大于这个字符串的情况那就让答案数组中的次数加1
        }
    }
    *returnSize = queriesSize;
    return ret;
}

struct ListNode* removeZeroSumSublists(struct ListNode* head) {
    struct ListNode* newhead = (struct ListNode*)malloc(sizeof(struct ListNode));
    newhead->val = 0;
    newhead->next = head;
    struct ListNode* cur = newhead;//用于确定子链的头节点
    int x = 0;
    while (cur)
    {
        struct ListNode* p = cur->next;//遍历寻找子链
        while (p)
        {
            x = x + p->val;
            if (x == 0)
            {
                cur->next = p->next;//删除和为0的子链
            }
            p = p->next;//遍历完这一条子链
        }
        进行到这里就判完一条子链了，去判断下一条子链
        x = 0;//重新为下一条子链初始化判断条件
        cur = cur->next;
    }
    return newhead->next;
}
int compare(const void* p1, const void* p2)
{
    return *(int*)p1 - *(int*)p2;
}
int unequalTriplets(int* nums, int numsSize) {
    qsort(nums, numsSize, sizeof(int), compare);//先将原数组排序完成
    int count = 0;
    for (int i = 0, j = 0; i < numsSize; i = j)//这里i的变化为什么是让i变成j，下面我会做出解释
    {
        while (j < numsSize && nums[j] == nums[i])
        {
            j++;
        }
        count += i * (j - i) * (numsSize - j);
        /*由题意可知，数组元素的相对顺序不影响结果，因此我们可以将数组  从小到大进行排序。排序后，数组中的相同元素一定是相邻的。当我们以某一堆相同的数 [i,j)作为三元组的中间元素时，这堆相同的元素的左边元素数目为 i，右边元素数目为 n−j，那么符合条件的三元组数目为(i*(j-i)*(n-j)),这里的n也就是numsSize*/

    }
    return count;
}
